\documentclass[%
    %draft,
    %submission,
    %compressed,
    a4paper,
    %12pt,
    10pt,
    final,
    %technote,
    %internal,
    %submitted,
    %inpress,
    %reprint,
    %titlepage,
    notitlepage,
    %anonymous,
    narroweqnarray,
    inline,
    oneside,
    %invited,
    %conference
    article
    ]{ieee}

%\documentclass[a4paper,11pt]{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage{multirow}
\usepackage{float}
\floatstyle{boxed} 
\usepackage{subfig}
\usepackage{epsfig}
\usepackage{epstopdf}

\newcommand{\latexiie}{\LaTeX2{\Large$_\varepsilon$}}

\begin{document}

\title[]{
	Trabajo Práctico 3\\
	Redes de Hopfield}

\author{
     Luciano Mangiarotti (I.T.B.A),
\and Federico Santos (I.T.B.A),
\and Jimena Pose (I.T.B.A) \\ \\ }

\maketitle

\section{Introducci\'on}

\noindent En este trabajo se tiene por objetivo analizar el comportamiento de una red de Hopfield actuando como memoria asociativa direccionable por el contenido. Para ello se utiliza un conjunto de patrones formado por imágenes en blanco y negro de $64 \times 64$ pixeles. \\

\noindent Para la utilización de la red se define un conjunto de memorización que consta de los patrones que se van a almacenar. Luego, se presenta un determinado patrón y se obtiene una respuesta de la red. \\

\noindent En este documento se analiza la respuesta de una red de Hopfield a partir de un determinado conjunto de memorización y un patrón a presentar determinado. \\

\noindent En la Sección II se presentan las consideraciones de implementación del trabajo. \\

\noindent En la Sección III se presentan las consideraciones que respectan a la capacidad de almacenamiento de la red. \\

\noindent En la Sección IV se presentan los resultados y conclusiones obtenidos a partir de las pruebas realizadas haciendo uso de conjuntos de memorización y patrones a presentar con distintas características.

\section{Consideraciones de implementación}

\noindent Uno de los factores a analizar es la arquitectura de la red de Hopfield. Se decidió utilizar una red con $4096$ neuronas, una por cada pixel de las imágenes que se usan como patrones. Al ser imágenes en blanco y negro se hace uso de los valores $-1$ y $1$ para representar el color correspondiente a un pixel. \\

\noindent El primer paso para la utilización de la red es el cómputo de los pesos. Los mismos se calculan a partir de los patrones que se desea almacenar. A diferencia del perceptrón multicapa, que es una red que utiliza un aprendizaje supervisado, los pesos no se modifican una vez calculados. \\

\noindent La dimensión que tiene la matriz de pesos es de $N \times N$, siendo $N$ la cantidad de neuronas. En nuestro caso la matriz de pesos es de $4096 \times 4096$. \\

\noindent De las dos posibles reglas de actualización, sincrónica y asincrónica, se eligió la asincrónica ya que es la que se utiliza en el modelo de Hopfield. \\

\noindent La actualización asincrónica consiste en actualizar las neuronas de a una por vez. Por cada paso, se selecciona aleatoriamente una de las neuronas y se actualiza, de manera que todas las neuronas se actualicen. \\

\noindent Se realiza la iteración hasta que el estado de las neuronas no se modifique más. \\

\noindent Una vez elegidos los patrones de almacenamiento y calculados los pesos, se procede a presentarle un patrón $\nu$ a la red y analizar el resultado al cual converge.\\

\noindent La elección de los patrones para el almacenamiento, va a depender de las cuencas de atracción que se deseen generar para la prueba que se quiera realizar. \\

\noindent Existe una cantidad máxima de patrones que la red puede almacenar correctamente, la misma depende directamente de la cantidad de neuronas y los patrones que se utilicen. \\

\noindent Cuando se dice que un patrón es almacenado o recuperado correctamente, significa que al presentar dicho patrón se obtiene como resultado una imagen exactamente igual al patrón original.

\section{Capacidad de almacenamiento}

\noindent Para analizar la capacidad de almacenamiento de la red, se procedió a definir un conjunto de patrones de almacenamiento con la máxima cantidad posible tal que se logre recuperar satisfactoriamente la totalidad de los mismos. \\

\noindent Se intenta estimar experimentalmente esta cantidad. Con la arquitectura planteada, se almacenaron y recuperaron correctamente hasta 7 imágenes. Este conjunto se muestra en la Figura \ref{fig:lote}. \\

\noindent La cantidad de patrones, las diversas cuencas de atracción que generan y el número de neuronas utilizadas hacen que se generen estados \textit{espurios} con cuencas de atracción. Por este motivo, algunos patrones no se logran recuperar correctamente cuando el conjunto a memorizar es muy grande. \\

\noindent Hay que tener en cuenta que, como no se probaron todas las combinaciones de patrones posibles, es posible que exista alguna combinación que permita almacenar más imágenes. \\

\noindent La selección de dichas imágenes se hizo empíricamente, teniendo en cuenta las características de cada una y los pixeles que tenían en común. \\

\noindent También puede darse el caso en el que la cantidad de patrones de almacenamiento sea adecuada, pero dadas las características de los patrones mismos, uno o más no se logre recuperar correctamente.

\section{Resultados y Conclusiones}

\noindent En esta sección se exponen los resultados obtenidos al ejecutar distintas pruebas, junto con sus respectivas conclusiones. \\

\noindent Cuando se almacena una serie de patrones en la red es importante verificar que sean \textit{verdaderos atractores}. Esto implica chequear que todos los patrones almacenados se puedan recuperar correctamente. \\

\noindent Los patrones almacenados generan cuencas de atracción, por lo que al presentarse una versión incompleta o \textit{ruidosa} de los mismos, se converge al original. A lo largo de la sección, se analizan los resultados obtenidos al presentar este tipo de patrones. \\

\noindent Además de las cuencas de atracción correspondientes a los patrones almacenados, se generan otras que corresponden a estados \textit{espurios}. \\

\noindent Entre ellos se encuentran los estados \textit{mezcla} y los estados \textit{inversos}. Resulta importante analizar en qué situaciones se converge a los mismos. \\

\noindent Se analizan también, los resultados que se obtienen al presentar patrones que no forman parte del conjunto de almacenamiento. \\

\noindent A continuación se presenta una serie de pruebas, donde se analizan los aspectos comentados anteriormente. \\

\subsection{Primera prueba}

\noindent En esta primera prueba se utilizan como patrones de almacenamiento a todas las imágenes que componen la Figura \ref{fig:lote1}. \\

\noindent Cuando se presentan nuevamente estos patrones, se recupera correctamente la Figura \ref{fig:lote1:b} y la Figura \ref{fig:lote1:c}. Esto se debe a los atractores que dichas imágenes generan. \\

\noindent En cambio, al presentar la Figura \ref{fig:lote1:a} converge a la Figura \ref{fig:lote1:b}. Esto se debe a que ambas figuras tienen la letra en la misma posición (existe superposición) y son letras muy similares. \\

\noindent En particular, puede considerarse a la Figura \ref{fig:lote1:a} como a una versión \textit{ruidosa} de la Figura \ref{fig:lote1:b}. Por consiguiente, en el almacenamiento prevalecen los atractores de la Figura \ref{fig:lote1:b} y debido a eso el resultado de la convergencia. \\

\noindent Resulta interesante conocer los resultados obtenidos al presentar una imagen \textit{ruidosa}. Para eso, se le presenta a la red la Figura \ref{fig:lote1a:a} obtenida a partir de la Figura \ref{fig:lote1:c} agregándole un 20\% de ruido. \\

\noindent En este caso, se recupera satisfactoriamente el patrón original a partir de una versión \textit{ruidosa} del mismo. Esta es una de las principales características de una memoria direccionable por el contenido. \\

\noindent Para analizar los resultados obtenidos a partir de patrones incompletos, se le presenta a la red la Figura \ref{fig:lote1a:b}, que es una versión incompleta de la Figura \ref{fig:lote1:c}. \\

\noindent En este caso se recupera la imagen correspondiente, mostrando que es posible recuperar satisfactoriamente el patrón original a partir de uno incompleto. Esta es otra característica de una memoria direccionable por el contenido. \\

\noindent Con el objetivo de almacenar correctamente las tres letras mostradas en la Figura \ref{fig:lote1}, se modifica la Figura \ref{fig:lote1:a} moviendo la letra \textit{A} hacia la esquina superior derecha, como muestra la Figura \ref{fig:lote1b}. \\

\noindent De esta manera, si bien el contenido de la imagen es similar a la Figura \ref{fig:lote1:a}, hay menos superposición entre ambas y se evita que la red las confunda. \\

\noindent Cuando se almacena el conjunto de patrones formado por las Figuras \ref{fig:lote1:b}, \ref{fig:lote1:c} y \ref{fig:lote1b}, se pueden recuperar todas las imágenes de dicho conjunto correctamente. \\

\subsection{Segunda prueba}

\noindent En esta prueba se pretende almacenar en una red a todas las imágenes que componen la Figura \ref{fig:lote2}. Al presentar nuevamente los patrones con los que fue entrenada la red, los mismos se recuperan correctamente. Esto se debe a que son \textit{verdaderos atractores}. \\

\noindent La Figura \ref{fig:lote2a} está compuesta por las versiones negadas de las imágenes del conjunto de patrones almacenado. Cuando se presentan las imágenes negadas, los resultados obtenidos convergen efectivamente a las imágenes negadas. \\

\noindent Si bien las imágenes negadas no fueron almacenadas explícitamente en la red, el estado inverso de los patrones genera cuencas de atracción iguales y opuestas que el patrón original. Esta característica permite recuperar tanto las versiones originales de cada patrón, como sus inversas. \\

\noindent Con el objetivo de estudiar la respuesta de dicha red frente a patrones que no fueron almacenados se utiliza una imagen de la prueba anterior. Al  presentarle la Figura \ref{fig:lote1:a}, la red converge a la Figura \ref{fig:lote2:a}. \\

\noindent Esto se debe a que existe una mayor superposición entre la Figura \ref{fig:lote1:a} y la Figura \ref{fig:lote2:a} que con el resto de las figuras almacenadas. Por lo tanto, las cuencas de atracción correspondientes a la Figura \ref{fig:lote2:a} generan dicha convergencia. \\

\noindent Si se le presenta a la red una imagen totalmente distinta a las del conjunto de almacenamiento, se observa que la red también converge a uno de los patrones. Al presentarle la imagen de la Figura \ref{fig:lote2b}, se obtiene como resultado la Figura \ref{fig:lote2:c}. \\

\noindent Esto se debe a que la mayor concentración de pixeles negros se da en la parte inferior de la imagen, haciendo que la red asocie a la nueva imagen con la Figura \ref{fig:lote2:c}. \\

\subsection{Tercera prueba}

\noindent En esta última prueba, se almacenan en una red las imágenes que forman el conjunto de patrones que se muestra en la Figura \ref{fig:lote3}.  \\

\noindent A pesar de las diferencias entre las imágenes almacenadas, la red permite recuperar correctamente cada imagen al presentar el patrón correspondiente. \\

\noindent Por último, resulta interesante ver cómo responde esta red cuando se le presentan otras imágenes totalmente distintas a las almacenadas. \\

\noindent Al presentar la Figura \ref{fig:lote3a:a}, se obtiene como resultado a la Figura \ref{fig:lote3a:b}. Se puede apreciar que esa entrada converge a un estado \textit{espurio}, que es una \textit{mezcla} de las imágenes almacenadas. Esto se produce debido a pequeñas cuencas de atracción que se generan a partir de las imágenes memorizadas. \\

\noindent La aparición de estos estados se observa con mayor frecuencia cuando se almacena una excesiva cantidad de patrones o se colocan imágenes muy distintas entre sí y con muchos pixeles en común. \\


% Figuras

\begin{figure*}
	\centering 
		\subfloat[bad-egg.png] {
			\label{fig:lote:a} 
			\boxed{\includegraphics[keepaspectratio=true]{bad-egg.png}} } 
		\hspace{0.1\linewidth} 
		\subfloat[circle1.png] {
			\label{fig:lote:b} 
			\boxed{\includegraphics[keepaspectratio=true]{circle1.png}} } 
		\hspace{0.1\linewidth} 
		\subfloat[circle2.png] {
			\label{fig:lote:c} 
			\boxed{\includegraphics[keepaspectratio=true]{circle2.png}} } 
		\hspace{0.1\linewidth} 
		\subfloat[line4.png] {
			\label{fig:lote:d} 
			\boxed{\includegraphics[keepaspectratio=true]{line4.png}} } 
		\hspace{0.1\linewidth} 
		\subfloat[picture.png] {
			\label{fig:lote:e} 
			\boxed{\includegraphics[keepaspectratio=true]{picture.png}} } 
		\hspace{0.1\linewidth} 
		\subfloat[windows.png] {
			\label{fig:lote:f} 
			\boxed{\includegraphics[keepaspectratio=true]{windows.png}} } 
		\hspace{0.1\linewidth} 
		\subfloat[rss.png] {
			\label{fig:lote:g} 
			\boxed{\includegraphics[keepaspectratio=true]{rss.png}} } 
	\caption[center]{Conjunto con la mayor cantidad de patrones que se almacenan correctamente.} 
	\label{fig:lote} 
\end{figure*}

\begin{figure*}
	\centering 
	\subfloat[Figura de la A] {
		\label{fig:lote1:a} 
		\boxed{\includegraphics[keepaspectratio=true]{a.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[Figura de la H] {
		\label{fig:lote1:b} 
		\boxed{\includegraphics[keepaspectratio=true]{h.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[Figura de la F] {
		\label{fig:lote1:c} 
		\boxed{\includegraphics[keepaspectratio=true]{f.png}} } 
	\caption[center]{Figuras correspondientes a la primera prueba} 
	\label{fig:lote1}
\end{figure*}

\begin{figure*}
	\centering 
	\subfloat[Figura \ref{fig:lote1:c} con un 20\% de ruido] {
		\label{fig:lote1a:a} 
		\boxed{\includegraphics[keepaspectratio=true]{noisy_f.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[Version de la Figura \ref{fig:lote1:c} incompleta] {
		\label{fig:lote1a:b} 
		\boxed{\includegraphics[keepaspectratio=true]{inc_f.png}} } 
	\caption[center]{Versiones modificadas de la imagen de la Figura \ref{fig:lote1:c}} 
	\label{fig:lote1a} 
\end{figure*}

\begin{figure*}
	\centering 
	\boxed{\includegraphics[keepaspectratio=true]{a2.png}} 
	\caption{Version desplazada de la imagen \ref{fig:lote1:a}} 
	\label{fig:lote1b} 
\end{figure*}

\begin{figure*}
	\centering 
	\subfloat[line1.png] {
		\label{fig:lote2:a} 
		\boxed{\includegraphics[keepaspectratio=true]{line1.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[line2.png] {
		\label{fig:lote2:b} 
		\boxed{\includegraphics[keepaspectratio=true]{line2.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[line3.png] {
		\label{fig:lote2:c} 
		\boxed{\includegraphics[keepaspectratio=true]{line3.png}} } 
	\caption[center]{Figuras correspondientes a la segunda prueba} 
	\label{fig:lote2} 
\end{figure*}

\begin{figure*}
	\centering 
	\subfloat[Negación de la Figura \ref{fig:lote2:a}]{
		\label{fig:lote2a:a} 
		\boxed{\includegraphics[keepaspectratio=true]{neg_line1.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[Negación de la Figura \ref{fig:lote2:b}]{
		\label{fig:lote2a:b} 
		\boxed{\includegraphics[keepaspectratio=true]{neg_line2.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[Negación de la Figura \ref{fig:lote2:c}]{
		\label{fig:lote2a:c} 
		\boxed{\includegraphics[keepaspectratio=true]{neg_line3.png}} } 
	\caption{Conjunto de imágenes negadas de la Figura \ref{fig:lote2}} 
	\label{fig:lote2a} 
\end{figure*}

\begin{figure*}
	\centering 
	\boxed{\includegraphics[keepaspectratio=true]{footprint.png}} 
	\caption{Imagen que representa una huella} 
	\label{fig:lote2b} 
\end{figure*}

\begin{figure*}
	\centering 
	\subfloat[picture.png] {
		\label{fig:lote3:a} 
		\boxed{\includegraphics[keepaspectratio=true]{picture.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[phone.png] {
		\label{fig:lote3:b} 
		\boxed{\includegraphics[keepaspectratio=true]{phone.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[sonic.png] {
		\label{fig:lote3:c} 
		\boxed{\includegraphics[keepaspectratio=true]{sonic.png}} } 
	\caption[center]{Figuras correspondientes a la tercera prueba} 
	\label{fig:lote3} 
\end{figure*}

\begin{figure*}
	\centering 
	\subfloat[Imagen del RSS] {
		\label{fig:lote3a:a} 
		\boxed{\includegraphics[keepaspectratio=true]{rss.png}} } 
	\hspace{0.1\linewidth} 
	\subfloat[Estado \textit{espurio}]{
		\label{fig:lote3a:b} 
		\boxed{\includegraphics[keepaspectratio=true]{espurio_output.png}} } 
	\caption{Ejemplo de un estado \textit{espurio}} 
	\label{fig:lote3a} 
\end{figure*}

\end{document}
